﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Kugar.Core.BaseStruct;
using Timer = System.Threading.Timer;
using Kugar.Core.ExtMethod;

namespace Kugar.Core.WinForm.ControlFlash
{

    ///// <summary>
    /////     DataGridView闪烁的控制类
    ///// </summary>
    //public class DataGridViewFlash
    //{
    //    private Timer timer = null;

    //    private List<FlashItem> itemList = new List<FlashItem>();

    //    /// <summary>
    //    ///     构造函数
    //    /// </summary>
    //    /// <param name="dataGrid">指定闪烁的表格控件</param>
    //    /// <param name="flashTime">指定闪烁的间隔时间(单位为毫秒)，不能小于500ms</param>
    //    public DataGridViewFlash(DataGridView dataGrid, int flashTime)
    //    {
    //        DataGrid = dataGrid;
    //        FlashDueTime = flashTime;

    //        if (dataGrid == null)
    //        {
    //            throw new NullReferenceException("指定的DataGridView不能为空");
    //        }

    //        if (flashTime < 500)
    //        {
    //            throw new Exception("闪烁的时间间隔不能少于500毫秒");
    //        }

    //        timer = new Timer(OnTimer, null, Timeout.Infinite, Timeout.Infinite);
    //    }

    //    public DataGridView DataGrid { private set; get; }

    //    /// <summary>
    //    ///     控件闪烁的间隔时间
    //    /// </summary>
    //    public int FlashDueTime { private set; get; }

    //    /// <summary>
    //    ///     添加指定行指定列的单元格为闪烁控件
    //    /// </summary>
    //    /// <param name="rowIndex">要闪烁的行</param>
    //    /// <param name="colName">要闪烁的列，如果要对整行进行闪烁，则该参数传空字符串</param>
    //    /// <param name="flashColor">闪烁时的颜色</param>
    //    public void StartFlash(int rowIndex, string colName, Color flashColor)
    //    {
    //        DataGridViewColumn column = null;

    //        if (!string.IsNullOrEmpty(colName))
    //        {
    //            column = DataGrid.Columns[colName];

    //            if (column == null)
    //            {
    //                throw new Exception("不存在指定名称的列");
    //            }
    //        }

    //        lock (itemList)
    //        {

    //            for (int i = 0; i < itemList.Count; i++)
    //            {
    //                var item = itemList[i];

    //                if (item.RowIndex == rowIndex && item.Column == column)
    //                {
    //                    throw new Exception("无法重复添加相同行相同列的闪烁");
    //                }
    //            }

    //            var oColor = DataGrid.GetCellBackColor(rowIndex, column.Index);

    //            var tempFlashItem = new FlashItem(oColor, flashColor, rowIndex, column, FlashType.Dynamic);

    //            itemList.Add(tempFlashItem);
    //        }
    //    }

    //    /// <summary>
    //    ///     暂停闪烁,并将背景色设置为原色
    //    /// </summary>
    //    /// <param name="rowIndex">要暂停闪烁的行</param>
    //    /// <param name="colName">要暂停闪烁的列，如果要取消整行的闪烁，则该参数传空字符串</param>
    //    public void StopFlash(int rowIndex, string colName)
    //    {
    //        FlashItem flashItem = null;

    //        for (int i = 0; i < itemList.Count; i++)
    //        {
    //            var item = itemList[i];

    //            if (item.RowIndex == rowIndex)
    //            {
    //                if (item.Column == null)
    //                {
    //                    flashItem = item;
    //                }
    //                else if (item.Column.Name == colName)
    //                {
    //                    flashItem = item;
    //                }
    //            }
    //        }

    //        if (flashItem != null)
    //        {
    //            flashItem.Type = FlashType.Disable;
    //        }

    //    }

    //    /// <summary>
    //    ///     暂停闪烁,并将背景色设置为闪烁色
    //    /// </summary>
    //    /// <param name="rowIndex">要暂停闪烁的行</param>
    //    /// <param name="colName">要暂停闪烁的列，如果要取消整行的闪烁，则该参数传空字符串</param>
    //    public void SuspendFlash(int rowIndex, string colName)
    //    {
    //        FlashItem flashItem = null;

    //        for (int i = 0; i < itemList.Count; i++)
    //        {
    //            var item = itemList[i];

    //            if (item.RowIndex == rowIndex)
    //            {
    //                if (item.Column == null)
    //                {
    //                    flashItem = item;
    //                }
    //                else if (item.Column.Name == colName)
    //                {
    //                    flashItem = item;
    //                }
    //            }
    //        }

    //        if (flashItem != null)
    //        {
    //            flashItem.Type = FlashType.Static;
    //        }

    //    }

    //    /// <summary>
    //    ///     移除指定闪烁
    //    /// </summary>
    //    /// <param name="rowIndex"></param>
    //    /// <param name="colName">要暂停闪烁的列，如果要删除整行的闪烁，则该参数传空字符串</param>
    //    public void RemoveFlash(int rowIndex, string colName)
    //    {
    //        DataGridViewColumn column = null;

    //        if (!string.IsNullOrEmpty(colName))
    //        {
    //            column = DataGrid.Columns[colName];
    //        }


    //        lock (itemList)
    //        {
    //            for (int i = 0; i < itemList.Count; i++)
    //            {
    //                var item = itemList[i];

    //                if (item.RowIndex == rowIndex && item.Column == column)
    //                {
    //                    itemList.RemoveAt(i);
    //                }
    //            }
    //        }

    //    }

    //    /// <summary>
    //    ///     关闭当前闪烁控制类
    //    /// </summary>
    //    public void Close()
    //    {
    //        Stop();

    //        itemList.Clear();
    //    }

    //    /// <summary>
    //    ///     停止所有的闪烁控件，并还原所有闪烁控件的原色
    //    /// </summary>
    //    public void Stop()
    //    {
    //        timer.Change(Timeout.Infinite, Timeout.Infinite);

    //        lock (itemList)
    //        {

    //            DataGrid.Invoke(() =>
    //                                {
    //                                    lock (itemList)
    //                                    {
    //                                        foreach (var item in itemList)
    //                                        {
    //                                            SetColor(item, FlashColorType.OriginalColor);
    //                                        }
    //                                    }
    //                                });

    //        }
    //    }

    //    /// <summary>
    //    ///     开始启用闪烁控件，并将所有选择的控件都改为允许闪烁
    //    /// </summary>
    //    public void Start()
    //    {
    //        lock (itemList)
    //        {
    //            foreach (var item in itemList)
    //            {
    //                item.Type = FlashType.Dynamic;
    //            }
    //        }


    //        timer.Change(FlashDueTime * 2, 200);
    //    }


    //    private void OnTimer(object state)
    //    {
    //        timer.Change(Timeout.Infinite, Timeout.Infinite);

    //        lock (itemList)
    //        {
    //            for (int i = 0; i < itemList.Count; i++)
    //            {
    //                var item = itemList[i];

    //                if (item.RowIndex >= DataGrid.Rows.Count)
    //                {
    //                    continue;
    //                }

    //                if (item.Type == FlashType.Disable)
    //                {
    //                    continue;
    //                }

    //                if (item.Type == FlashType.Static)
    //                {
    //                    if (item.CurrentColor == FlashColorType.FlashColor)
    //                    {
    //                        continue;
    //                    }
    //                    else
    //                    {
    //                        DataGrid.Invoke(new SetColorDelegate(SetColor), item, FlashColorType.FlashColor);
    //                        continue;
    //                    }
    //                }

    //                if (item.Type == FlashType.Dynamic)
    //                {
    //                    FlashColorType colorType;

    //                    colorType = item.CurrentColor == FlashColorType.FlashColor ? FlashColorType.OriginalColor : FlashColorType.FlashColor;

    //                    DataGrid.Invoke(new SetColorDelegate(SetColor), item, colorType);
    //                }
    //            }
    //        }



    //        //重新打开计时器
    //        timer.Change(this.FlashDueTime, 10);

    //    }

    //    private void SetColor(FlashItem item, FlashColorType colorType)
    //    {
    //        if (item == null || item.CurrentColor == colorType || item.RowIndex > DataGrid.Rows.Count || (item.Column != null && !DataGrid.Columns.Contains(item.Column)))
    //        {
    //            return;
    //        }

    //        Color color = default(Color);

    //        switch (colorType)
    //        {
    //            case FlashColorType.OriginalColor:
    //                color = item.OriginalColor;
    //                break;
    //            case FlashColorType.FlashColor:
    //                color = item.FlashColor;
    //                break;
    //        }

    //        if (item.Column == null)
    //        {
    //            DataGrid.SetRowBackColor(item.RowIndex, color);
    //        }
    //        else
    //        {
    //            DataGrid.SetCellBackColor(item.RowIndex, item.Column.Index, color);
    //        }
    //    }

    //    private delegate void SetColorDelegate(FlashItem item, FlashColorType colorType);

    //    private class FlashItem
    //    {
    //        public FlashItem(Color originalColor, Color flashColor, int rowIndex, DataGridViewColumn column, FlashType type)
    //        {
    //            OriginalColor = originalColor;
    //            FlashColor = flashColor;
    //            RowIndex = rowIndex;
    //            Column = column;
    //            Type = type;
    //        }

    //        public Color OriginalColor { set; get; }

    //        public Color FlashColor { set; get; }

    //        public int RowIndex { set; get; }

    //        public DataGridViewColumn Column { set; get; }

    //        public FlashType Status { set; get; }

    //        public FlashColorType CurrentColor { set; get; }
    //    }
    //}



    public enum FlashColorType
    {
        OriginalColor = 0,
        FlashColor = 1
    }

    public enum FlashType
    {
        Disable,
        Dynamic,
        Static
    }
}
